// 请你仅使用两个栈实现先入先出队列。
// 队列应当支持一般队列的支持的所有操作（push、pop、peek、empty）：

// 实现 MyQueue 类：
// void push(int x) 将元素 x 推到队列的末尾
// int pop() 从队列的开头移除并返回元素
// int peek() 返回队列开头的元素
// boolean empty() 如果队列为空，返回 true ；否则，返回 false

class MyQueue {
    queue: number[];
    stack: number[];
    constructor() {
        this.queue = [];
        this.stack = [];
    }

    push(x: number): void {
        this.stack.push(x);
    }

    pop(): number {
        // 如果队列为空，把所有栈中的弹入队列
        if (this.queue.length === 0) {
            while (this.stack.length > 0) {
                this.queue.push(this.stack.pop()!);
            }
        }
        return this.queue.pop() ?? -1;
    }

    peek(): number {
        // 如果队列为空，把所有栈中的弹入队列
        if (this.queue.length === 0) {
            while (this.stack.length > 0) {
                this.queue.push(this.stack.pop()!);
            }
        }
        return this.queue[this.queue.length - 1];
    }

    empty(): boolean {
        return this.queue.length === 0 && this.stack.length === 0;
    }
}


// 难度不大的一道题目，核心是理解
// 当一个栈按出栈顺序形成集合入另一个栈时，
// 另一个栈的出栈顺序就是队列顺序...把握这一个点就可以了
// 剩下时刻关注两个栈的元素情况并处理好边界情况即可。